package com.feonix.utils;

import java.util.List;
import java.util.Map;
import java.util.Set;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;


public class RedisUtil {

	private static Jedis jedis;

	private RedisUtil() {
	}

	static {
		String host = PropertyUtil.getValue("redis.host");
		int port = Integer.valueOf(PropertyUtil.getValue("redis.port"));
		String pass = PropertyUtil.getValue("redis.pass");
		int maxIdle = Integer.valueOf(PropertyUtil.getValue("redis.maxIdle"));
		int maxTotal = Integer.valueOf(PropertyUtil.getValue("redis.maxTotal"));
		int maxWaitMillis = Integer.valueOf(PropertyUtil.getValue("redis.maxWaitMillis"));
		int timeOut = Integer.valueOf(PropertyUtil.getValue("redis.timeOut"));
		boolean testOnBorrow = Boolean.valueOf(PropertyUtil.getValue("redis.testOnBorrow"));
		JedisPoolConfig p = new JedisPoolConfig();
		p.setMaxIdle(maxIdle);
		p.setMaxTotal(maxTotal);
		p.setMaxWaitMillis(maxWaitMillis);
		p.setTestOnBorrow(testOnBorrow);
		jedis = new JedisPool(p, host, port, timeOut, pass).getResource();
		// jedis = new JedisPool().getResource();
	}

	public static void set(String key, String value) {
		jedis.set(key, value);
	}

	/**
	 * 添加key value 并且设置存活时间
	 */
	public static void set(String key, String value, int liveTime) {
		set(key, value);
		jedis.expire(key, liveTime);
	}

	/**
	 * 根据key获取value
	 */
	public static String get(String key) {
		String value = jedis.get(key);
		return value;
	}

	/**
	 * 检查key是否已经存在
	 */
	public static boolean exists(String key) {
		return jedis.exists(key);
	}

	/**
	 * 删除某个key
	 */
	public static void del(String key) {
		jedis.del(key);
	}

	/**
	 * 清空redis 所有数据
	 */
	public static String flushDB() {
		return jedis.flushDB();
	}

	/**
	 * 检查是否连接成功,输出PONG则表示连接成功
	 */
	public static String ping() {
		return jedis.ping();
	}

	/**
	 * 获取系统中所有key
	 */
	public static Set<String> getAllKeys() {
		return jedis.keys("*");
	}

	/**
	 * 查看key所储存的值的类型
	 */
	public static String getValueTypeByKey(String key) {
		return jedis.type(key);
	}

	/**
	 * 设置Map
	 */
	public static void operateSetMap(String key, Map<String, String> map) {
		jedis.hmset(key, map);
	}

	/**
	 * 获取map中的值
	 */
	public static List<String> operateGetMap(String key, String... fields) {
		return jedis.hmget(key, fields);
	}

	/**
	 * 设置List(List只能存储String)
	 */
	public static void operateSetList(String key, List<String> list) {
		jedis.del(key); // 开始前，先移除所有的内容
		for (String str : list) {
			jedis.lpush(key, str);
		}
	}

	/**
	 * 获取List
	 */
	public static List<String> operateGetList(String key) {
		return jedis.lrange(key, 0, -1);
	}

	/**
	 * 设置Set(Set只能存储String)
	 */
	public static void operateSet(String key, Set<String> set) {
		jedis.del(key); // 开始前，先移除所有的内容
		for (String str : set) {
			jedis.sadd(key, str);
		}
	}

	/**
	 * 获取Set(Set只能存储String)
	 */
	public static Set<String> operateGetSet(String key) {
		return jedis.smembers(key);
	}

	/**
	 * 存储object对象
	 * @param key
	 * @param obj
	 */
	public static void setObject(String key, Object obj){
		jedis.set(key.getBytes(), SerializeUtil.serialize(obj));		
	}
	
	/**
	 * 取object对象
	 * @param key
	 * @return
	 */
	public static Object getObject(String key){
		byte[] keyByte = jedis.get((key).getBytes());
		return SerializeUtil.unserialize(keyByte);		
	}

}
